package studio.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import studio.util.ConexionBD;
import studio.excepcion.DAOExcepcion;
import studio.modelo.InstAdicional;
import studio.modelo.InstBasico;
import studio.modelo.InstExterno;
import studio.modelo.Instrumento;
import studio.modelo.Reserva;
import studio.modelo.Sala;
import studio.modelo.SerAdicional;
import studio.modelo.SerBasico;


public class ReservaDao extends BaseDAO {
	
	
	public Collection<Reserva> buscarPorFechaSala(String fecha, int sala) throws DAOExcepcion {
		System.out.println("Reserva: buscarPorFechaSala(String fecha, int sala)");
		String query = "SELECT idReserva, Sala_Armada_idSalaArmada, Usuario_idUsuario, fecha, fechaHoraInicio, fechaHoraFinal FROM reserva WHERE fecha=? and Sala_Armada_idSalaArmada=?";
		Collection<Reserva> lista = new ArrayList<Reserva>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, fecha);
			stmt.setInt(2, sala);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Reserva vo = new Reserva();
				vo.setIdReserva(rs.getInt("idReserva"));
				vo.setSala_Armada_idSalaArmada(rs.getInt("Sala_Armada_idSalaArmada"));
				vo.setUsuario_idUsuario(rs.getInt("Usuario_idUsuario"));
				vo.setFecha(rs.getString("fecha"));
				vo.setHoraInicio(rs.getString("fechaHoraInicio"));
				vo.setHoraFinal(rs.getString("fechaHoraFinal"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
		public void insertarReserva(Reserva objReserva) throws DAOExcepcion
	{
		//System.out.println("ReservaDao: insertar(Reserva objUsuario)");
		//System.out.println("ReservaDao: insertar(Reserva objSala)");
		String query = "insert into Reserva (Fecha,fechaHoraInicio,fechaHoraFinal,Estado, subTotal,igv,total,Sala_Armada_idSalaArmada, Usuario_idUsuario) values (?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
            //stmt.setDate(1,((Date)objReserva.Fecha));
			stmt.setString(1,objReserva.Fecha);
			stmt.setString(2,objReserva.HoraInicio);
			stmt.setString(3,objReserva.HoraFinal);
			stmt.setString(4,objReserva.Estado);
			stmt.setDouble(5, objReserva.subTotal);
			stmt.setDouble(6, objReserva.igv);
			stmt.setDouble(7, objReserva.total);
			stmt.setInt(8, objReserva.Sala_Armada_idSalaArmada);
			stmt.setInt(9, objReserva.Usuario_idUsuario);
											
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			else
			{
				int idNroReserva=0;
				String ConsultarIdGenerado="SELECT LAST_INSERT_ID()";
				stmt=con.prepareStatement(ConsultarIdGenerado);
				rs=stmt.executeQuery();
				if(rs.next())
				{
					idNroReserva=rs.getInt(1);
				}
				objReserva.setIdReserva(idNroReserva);
				for (InstAdicional intru : objReserva.getInstAdicional()) {
					String detalleInstrumento="insert into reserva_instrum(Reserva_idReserva,Instrumento_idInstrumento,TipoRecurso_idTipoRecurso,QtInstr,importe) values(?,?,?,?,?)";
					stmt=con.prepareStatement(detalleInstrumento);
					stmt.setInt(1,objReserva.getIdReserva());
					stmt.setInt(2, intru.getIdInstrumento());
					stmt.setInt(3,intru.objTipRecur.getIdTipoRecurso() );
					stmt.setDouble(4,intru.getQInstrumento());
					stmt.setDouble(5, intru.getImporte());
					int insertarInstru=0;
					insertarInstru=stmt.executeUpdate();
					if(insertarInstru!=1)
					{
						throw new SQLException("No se pudo insertar");
					}
					else
					{
						System.out.println("Instrumento Insertado Correctamnte a la Reserva");
					}
				}
				
				for (SerAdicional serv:objReserva.getSerAdicional())
				{
					String detalleServicio="insert into reserva_servicio(Reserva_idReserva,TipoRecurso_idTipoRecurso,Servicio_idServicio,QtServ,importe)values(?,?,?,?,?)";
					stmt=con.prepareStatement(detalleServicio);
					stmt.setInt(1,objReserva.getIdReserva());
					stmt.setInt(2,serv.objTipRecur.getIdTipoRecurso() );
					stmt.setInt(3,serv.getIdServicio());
					stmt.setInt(4,serv.getQServicio());
					stmt.setDouble(5,serv.getImporte());
					int insertarServ=0;
					insertarServ=stmt.executeUpdate();
					if(insertarServ!=1)
					{
						throw new SQLException("No se pudo insertar el servicio");
					}
					else
					{
						System.out.println("Servicio Insertado Correctamnte a la Reserva");
					}
				}
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} 
		finally
		{
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

		public Collection<InstAdicional> buscarInstrumentosAdi(int idReserva) throws DAOExcepcion {
			System.out.println("InstrumentoAdicional: buscarInstrumentosAdi(int idReserva)");
			String query = "SELECT Reserva_idReserva, Instrumento_idInstrumento, QtInstr, importe FROM Reserva_Instrum WHERE Reserva_idReserva=?";
			Collection<InstAdicional> lista = new ArrayList<InstAdicional>();
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idReserva);
				rs = stmt.executeQuery();
				while (rs.next()) {
					InstAdicional vo = new InstAdicional();
					vo.setIdReserva(rs.getInt("Reserva_idReserva"));
					vo.setIdInstrumento(rs.getInt("Instrumento_idInstrumento"));
					vo.setQInstrumento(rs.getInt("QtInstr"));
					vo.setImporte(rs.getDouble("importe"));
					lista.add(vo);
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return lista;
		}
		
		public Collection<SerAdicional> buscarServiciosAdi(int idReserva) throws DAOExcepcion {
			System.out.println("ServicioAdicional: buscarServiciosAdi(int idReserva)");
			String query = "SELECT Reserva_idReserva, Servicio_idServicio, QtServ, importe FROM Reserva_Servicio WHERE Reserva_idReserva=?";
			Collection<SerAdicional> lista = new ArrayList<SerAdicional>();
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idReserva);
				rs = stmt.executeQuery();
				while (rs.next()) {
					SerAdicional vo = new SerAdicional();
					vo.setIdReserva(rs.getInt("Reserva_idReserva"));
					vo.setIdServicio(rs.getInt("Servicio_idServicio"));
					vo.setQServicio(rs.getInt("QtServ"));
					vo.setImporte(rs.getDouble("importe"));
					lista.add(vo);
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return lista;
		}
		
}
